package com.pai4j.common.util.file;
import com.pai4j.common.enums.community.ResourceFormatEnum;
import com.pai4j.common.util.DateUtils;
import com.pai4j.common.util.HttpClientUtil;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.util.Date;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import static com.pai4j.common.util.DateUtils.YYYYMMDD;

public class FileUtil {

    private static FileNameMap fileNameMap = null;


    /***
     * 本地临时文件目录
     */
        public static final String LOCAL_TEMP_DIR = "/Users/mac/Desktop/image/";
//    public static final String LOCAL_TEMP_DIR = "/home/work/temp/image/";


    /***
     * 生成上传文件的文件名称
     * @param oriFileName
     * @return
     */
    public static String generateFileName(String oriFileName) {
        StringBuffer bf = new StringBuffer();
        bf.append(UUID.randomUUID().toString().replaceAll("-", ""));
        String type = null;
        if (StringUtils.isNotBlank(oriFileName)) {
            String[] fileNames = oriFileName.split("\\.");
            bf.append("_");
            bf.append(stringFilter(fileNames[0]));
            if (fileNames.length > 1) {
                type = "." + fileNames[1];
            }
        }

        String fileName = bf.toString() + "/" + type;
        fileName = fileName.replaceAll("/", "");
        fileName = fileName.replaceAll("\n", "");
        return fileName;

    }

    public static String stringFilter(String str) throws PatternSyntaxException {
        // 清除掉所有特殊字符
        String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.replaceAll("").trim();
    }

    /***
     * 根据mimeType进行文件类型分类
     * @param mimeType
     * @return
     */
    public static String getFileType(String mimeType) {
        if (StringUtils.isBlank(mimeType)) {
            return FileMimeTypeEnum.OTHER.getType();
        }
        if (mimeType.contains("image")) {
            return FileMimeTypeEnum.IMAGE.getType();
        }
        if (mimeType.contains("video")) {
            return FileMimeTypeEnum.VIDEO.getType();
        }
        return FileMimeTypeEnum.OTHER.getType();
    }

    /***
     * 根据文件名对文件进行分类
     * @param fileName
     * @return
     */
    public static String getFileTypeByName(String fileName) {
        // 扩展FileNameMap中不包含的集中MimeType
        if (StringUtils.lowerCase(fileName).endsWith(".mp4") ||
                StringUtils.lowerCase(fileName).endsWith(".swf") ||
                StringUtils.lowerCase(fileName).endsWith(".flv") ||
                StringUtils.lowerCase(fileName).endsWith(".wmv") ||
                StringUtils.lowerCase(fileName).endsWith(".rm") ||
                StringUtils.lowerCase(fileName).endsWith(".ram")) {
            return FileMimeTypeEnum.VIDEO.getType();
        }
        if (StringUtils.lowerCase(fileName).endsWith(".psd") ||
                StringUtils.lowerCase(fileName).endsWith(".pdd")) {
            return FileMimeTypeEnum.IMAGE.getType();
        }
        return getFileType(getMimeType(fileName));
    }

    public static String getMimeType(String fileName) {
        if (StringUtils.isBlank(fileName)) {
            return null;
        }
        return getFileNameMap().getContentTypeFor(fileName);
    }

    /**
     * 获得文件URL,集群环境，拼装相对主机名的URL
     *
     * @param fileURL
     * @param remoteHost
     *
     * @return
     */
    public static String getFileURL(String fileURL, String remoteHost) {
        if (StringUtils.isNotBlank(fileURL) && !fileURL.contains("http")) {
            fileURL = "http://" + remoteHost + ":" + fileURL;
        }

        return fileURL;
    }

    private static FileNameMap getFileNameMap() {
        if (fileNameMap == null) {
            fileNameMap = URLConnection.getFileNameMap();
        }
        return fileNameMap;
    }

    public static File downloadNetWorkFile(String netWorkResourceUrl) {
        // 临时下载目录 TEMP_DIR + 今天
        String tempDownloadDir = LOCAL_TEMP_DIR.concat(DateUtils.getDate2String(YYYYMMDD, new Date())).concat("/");
        File dirWithDate = new File(tempDownloadDir);
        if (!dirWithDate.exists()) {
            // 目录不存在时，创建临时目录
            dirWithDate.mkdirs();
        }
        // 文件名称规则
        String format = format(netWorkResourceUrl);
        String fileName = tempDownloadDir.concat(FileUtil.generateFileName(System.currentTimeMillis() + "." +format));
        // 下载文件
        File downloadFile = new File(fileName);
        // 下载到本地
        HttpClientUtil.downloadByResourceUrl(netWorkResourceUrl, null, null, downloadFile);
        return downloadFile;
    }

    public static String format(String netWorkResourceUrl) {
        return ResourceFormatEnum.getFileExtNameByFileName(netWorkResourceUrl);
    }
}